package com.atguigu.lease.web.app.custom.interceptor;

import com.atguigu.lease.common.context.LoginContext;
import com.atguigu.lease.common.context.LoginUser;
import com.atguigu.lease.common.context.LoginUserContext;
import com.atguigu.lease.common.exception.LeaseException;
import com.atguigu.lease.common.result.ResultCodeEnum;
import com.atguigu.lease.common.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/*
* 认证(是否登录)的拦截器
* */
@Component
public class AuthenticationInterceptor implements HandlerInterceptor {

    /*
    *  拦截请求的方法
    * */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("access_token");
         if(token==null){
              throw  new LeaseException(ResultCodeEnum.APP_LOGIN_AUTH);
         }else{
             Claims claims = JwtUtil.parserToken(token);//解析token （会验证token是否过期）
             Long userId = claims.get("userId", Long.class);
             String userName = claims.get("account", String.class);
            // request.setAttribute("userId",userId);

             LoginUserContext.setLoginUser(new LoginUser(userId,userName));
         }



        return  true;//放行

    }

    /*
    *   拦截: 控制器方法执行完毕之后的响应信息
    * */

    /*
    *
    *    控制器方法执行完毕且springmvc中的前端控制器也执行完毕 ，响应的信息必经之路 相当于 finally
    * */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
                LoginUserContext.clear();
    }
}
